home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue70 / alfresco / AAStrBld.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-05-08  |  2.0 KB  |  82 lines

  1. {*********************************************************}
  2. {* AAStrBld                                              *}
  3. {* Copyright (c) Julian M Bucknall 2001                  *}
  4. {* All rights reserved.                                  *}
  5. {*********************************************************}
  6. {* Algorithms Alfresco: String builder class             *}
  7. {*********************************************************}
  8.  
  9. {Note: this unit is released as freeware. In other words, you are free
  10.        to use this unit in your own applications, however I retain all
  11.        copyright to the code. JMB}
  12.  
  13. unit AAStrBld;
  14.  
  15. interface
  16.  
  17. uses
  18.   SysUtils;
  19.  
  20. type
  21.   TaaStringBuilder = class
  22.     {a class that efficiently builds strings character by character}
  23.     private
  24.        FBuffer   : PByteArray;
  25.        FCount    : integer;
  26.        FCapacity : integer;
  27.     protected
  28.       procedure sbGrow;
  29.     public
  30.       destructor Destroy; override;
  31.  
  32.       procedure Add(aCh : char);
  33.       function AsString : string;
  34.   end;
  35.  
  36. implementation
  37.  
  38. {===TaaStringBuilder=================================================}
  39. destructor TaaStringBuilder.Destroy;
  40. begin
  41.   if (FCapacity <> 0) then
  42.     FreeMem(FBuffer, FCapacity);
  43.   inherited Destroy;
  44. end;
  45. {--------}
  46. procedure TaaStringBuilder.Add(aCh : char);
  47. begin
  48.   if (FCapacity = FCount) then
  49.     sbGrow;
  50.   FBuffer^[FCount] := byte(aCh);
  51.   inc(FCount);
  52. end;
  53. {--------}
  54. function TaaStringBuilder.AsString : string;
  55. begin
  56.   if (FCount = 0) then
  57.     Result := ''
  58.   else begin
  59.     SetLength(Result, FCount);
  60.     Move(FBuffer^, Result[1], FCount);
  61.     FCount := 0;
  62.   end;
  63. end;
  64. {--------}
  65. procedure TaaStringBuilder.sbGrow;
  66. var
  67.   NewBuffer : PByteArray;
  68.   NewCap    : integer;
  69. begin
  70.   NewCap := FCapacity + 256;
  71.   GetMem(NewBuffer, NewCap);
  72.   if (FCapacity <> 0) then begin
  73.     Move(FBuffer^, NewBuffer^, FCapacity);
  74.     FreeMem(FBuffer, FCapacity);
  75.   end;
  76.   FBuffer := NewBuffer;
  77.   FCapacity := NewCap;
  78. end;
  79. {====================================================================}
  80.  
  81. end.
  82.